/**
 * @file grpc_client.h
 * @brief gRPC客户端封装 - 基于gRPC的通信层
 */

#ifndef KWDB_GRPC_CLIENT_H
#define KWDB_GRPC_CLIENT_H

#include "config.h"
#include "data_point.h"
#include "query_result.h"

#include <grpcpp/grpcpp.h>
#include <grpcpp/channel.h>
#include <grpcpp/client_context.h>
#include <grpcpp/create_channel.h>
#include <grpcpp/security/credentials.h>

#include <memory>
#include <string>
#include <vector>
#include <atomic>

namespace kwdb {

// 前向声明 - PIMPL模式
class GrpcClientImpl;

/**
 * @brief gRPC客户端封装类
 * 
 * 负责与KWDB服务器的gRPC通信，包括：
 * - 连接管理
 * - 数据写入（单条、批量、流式）
 * - 数据查询（SQL、流式查询）
 * - 健康检查
 */
class GrpcClient {
public:
    /**
     * @brief 构造函数
     * @param config 客户端配置
     */
    explicit GrpcClient(const ClientConfig& config);
    
    /**
     * @brief 析构函数
     */
    ~GrpcClient();
    
    /**
     * @brief 连接到服务器
     * @throws KWDBException 连接异常
     */
    void connect();
    
    /**
     * @brief 断开连接
     */
    void disconnect();
    
    /**
     * @brief 写入单条数据点
     * @param dataPoint 数据点
     * @throws KWDBException 写入异常
     */
    void write(const DataPoint& dataPoint);
    
    /**
     * @brief 批量写入数据点
     * @param dataPoints 数据点列表
     * @throws KWDBException 写入异常
     */
    void writeBatch(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 流式写入数据点
     * @param dataPoints 数据点列表
     * @throws KWDBException 写入异常
     */
    void writeStream(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 执行SQL查询
     * @param sql SQL语句
     * @return 查询结果
     * @throws KWDBException 查询异常
     */
    QueryResult query(const std::string& sql);
    
    /**
     * @brief 流式查询
     * @param sql SQL语句
     * @return 查询结果
     * @throws KWDBException 查询异常
     */
    QueryResult queryStream(const std::string& sql);
    
    /**
     * @brief 健康检查
     * @return 是否健康
     */
    bool healthCheck();
    
    /**
     * @brief 获取统计信息
     * @return 统计信息JSON字符串
     */
    std::string getStats();

private:
    ClientConfig config_;
    std::unique_ptr<GrpcClientImpl> impl_;  // PIMPL - 隐藏gRPC实现细节
    std::atomic<bool> connected_;
    
    /**
     * @brief 创建gRPC通道
     * @return 通道指针
     */
    std::shared_ptr<grpc::Channel> createChannel();
    
    /**
     * @brief 创建客户端上下文
     * @return 上下文指针
     */
    std::unique_ptr<grpc::ClientContext> createContext();
    
    /**
     * @brief 处理gRPC状态
     * @param status gRPC状态
     * @throws KWDBException 状态异常
     */
    void handleGrpcStatus(const grpc::Status& status);
    
    /**
     * @brief 转换DataPoint到gRPC消息
     * @param dataPoint 数据点
     * @return gRPC消息
     */
    // 这里需要根据实际的gRPC生成代码调整
    // DataPointProto toProto(const DataPoint& dataPoint);
    
    /**
     * @brief 从gRPC消息转换QueryResult
     * @param response gRPC响应
     * @return 查询结果
     */
    // QueryResult fromProto(const QueryResponseProto& response);
};

} // namespace kwdb

#endif // KWDB_GRPC_CLIENT_H
